#include<iostream>
using namespace std;

// 空指针调用成员函数

class Person11{
public:
    int m_Age;
    void showClassName(){
        cout << "this is Person class" << endl;
    }
    void showPersonAge(){
        // 报错的原因是因为传入的指针是为了NULL
        cout << "age =" << this->m_Age << endl;
    }
};

void test01(){
    Person11 * p = NULL;
//    p->showClassName();
    p->showPersonAge();
}

// 常函数
class Person12{
public:
    int m_A;
    mutable int m_B;  // 特殊变量，即使在常函数中也可以修改这个值，加关键字mutable
    // this指针的本质是指针常量
    // Person * const this;
    // 在成员函数后面加const，修饰的是this指向，让指针指向的值也不可以修改
    void showPerson() const{
//        this->m_A = 100;  // this指针的值可以修改
//        this = NULL;  // this指针的指向是不可以修改的
        this->m_B = 100;
    }
    void func(){
        m_A = 100;
    };

};

void test02(){
    Person12 p;
    p.showPerson();
}

// 常对象
void test03(){
    const Person12 p{};  // 在对象前加const，变为常对象
//    p.m_A = 100;
    p.m_B = 100;  // m_B是特殊值，在常对象下也可以修改

    // 常对象只能调用常函数
    p.showPerson();
//    p.func();  // 常对象不可以调用普通成员函数，因为普通成员函数可以修改属性
}


int main(){
//    test01();

//    test02();

    test03();
}